//
//  ViewController.m
//  LLDBDemo
//
//  Created by czera on 2020/4/25.
//  Copyright © 2020 czera. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

void test1(){
    NSLog(@"test1: %d",3);
}


-(void)eatWithObject:(NSString *)objc{
    a = 20;
    NSLog(@"吃到了 %@",objc);
}

int a = 10;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}


- (IBAction)save:(id)sender {
    NSLog(@"保存！");
}
- (IBAction)pauseGame:(id)sender {
    NSLog(@"暂停！");
}

- (IBAction)continueGame:(id)sender {
    NSLog(@"继续！");
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    [self eatWithObject:@"汉堡"];
}


/*
 * ASLR简介
 * chise安装&使用
 * DerekSelander-LLDB
 * Cycript安装&简单使用
 * 脚本自动链接
 * Cycript练习
 * Cycript高级用法
 * cy文件封装
 */

/*
ASLR简介
1. 基础代码，touchBegan:withEvent: 调用一个简单的方法
2. Build一下，将LLDBDemo的可执行文件复制一份出来，使用Hopper查看，获取到自己写的方法的地址。
3.使用 breakpoint -a 0xxx 下一个地址断点。
4.使用 MachOView 分析PageZero地址，分析出
 注意：image list的首地址和hopper中的地址，他们中间有一个偏移地址
      因为image list 每次加载进内存都会默认加一个ASLR，所以我们得到一个数据的地址时要减去image list地址，这时可以通过MachO文件来查看数据。
 macho中的地址+hopper中的函数地址就是当前的函数地址
 
 定义一个全局变量，找到这个变量的地址，使用MachO对应的变量，找MachO中的偏移值
*/

/*
chisel 安装
1.github开源，可通过homebrew安装
2.安装完成添加一个路径到 .lldbinit中

3.使用
4.chisel 本质 注意配置完chise需要重启xcode或者在lldb命令中使用 command source ~/.lldbinit
5.pviews / pview self.view / pview -u self 命令的使用
6.pvc 查看控制器的层级结构
7.presponder 控件地址 输出这个按钮的响应链条
8.pactions 地址      得到当前按钮的响应事件
9.pclass 对象地址     得到对象的继承关系
10.fv/fvc 类名       查看视图/查看控制器
11.methods 类对象地址 找到当前类的方法，属性，地址
12.pinternals 类对象地址 查到当前对象的属性，当前对象的属性值
13.fvc -v 对象地址    根据对像的地址找到对象的类型
14.taplog            找到当前界面中响应的控件的对象、地址
 注意：1.界面控件是可响应的
      2.这个命令会使当前的程序挂掉
15. filcker 对象地址  将当前的控件闪烁显示，快速找到某一个控件
16. vs 对象地址       动态的操作这个控件，进入到LLDB中，根据提示调试
*/

/*
DerekSelander-LLDB
1.github 安装 参照 chisel 安装
2.search UIView      查找所有View
3.使用monkeyDev 调试
4.快速定位
 4.1 通过内存地址下断点
 4.2 使用 search 类名 查到对象的地址
 4.3 使用 methods 地址 找到对象的成员变量/方法
 4.4 使用 b -a 地址 设置断点
 4.5 使用 bt 查看当前的调用栈，会发现当前的状态是去符号的状态
 4.6 sbt 恢复当前函数的符号
*/


/*
Cycript-安装
1.Cycript 简介
2.Cycript 安装
3.Cycript 简单使用
 首先链接手机
 monkeyDev 使用，monkeydev 默认连接手机端口 6666
 
 2.应用跑起来，打开终端，查看手机ip
 3.ccycript -r xxx.xxx.xxx.xxx:6666
 4.终端输入UIWindow keyWindow()
 5.[UIApplication shardAppliccation]
 6.var keyWindow = UIWindow.keyWindow()
 7.keyWindow
 8.keyWindow.rootViewController
 9.#内存地址 拿到这个对象
 10.*#内存地址 拿到某个对象的所有成员变量
 11.也可以使用上面的 keyWindow
 12.[i for(i in *keyWindow)] // 拿到keyWindow的所有成员变量，只拿key
 13.keyWindow.reccursiveDescription // 拿到视图的层级关系，会发现拿到的都是乱码
 14.keyWindow.reccursiveDescription.toString() // 格式化输出
 15.choose[UIButton] // 获取Button类型的控件 不知是全项目中的还是当前文件中的，这个要测试
 16.使用 control+D 退出，然后重新连接，之前的keyWindow 还是在的。（因为当前的进程还是在的，如果把当前的进程删掉就没有了）
 
 17. 脚本自动连接
 18. 将所有的脚本放在一个文件夹中，给脚本可执行权限，并在.base_podfile中添加相应的路径
 
cycript 简单使用
 1.进入cycript环境
 2.修改当前界面的状态栏
    [UIApp setStatusBarHidden:YES]; // 隐藏状态栏
    [UIApp setStatusBarHidden:NO];  // 显示状态栏
    [UIApp setApplicationIconBadgeNumber:9999]; // 修改消息条数
 
 3.修改转账金额数据
    chose[UILabel] // 查找UILabel
    搜索刚才的 0.01 的文本
    拿到对象使用 #对象.text = "¥xxx" // 注意，当这个界面消失的时候，这个对象就没有了，所以界面也没有了

cycript 高级用法
 1.cycript 内置的对象 ObjectiveC.classes // 列举当前项目中的所有的类
 2.APPID 获取当前的 Build id
 3.pviews()               // 获取项目中的Views
 4.pvcs()                 // 获取控制器
 5.调试某一个按钮
    LLDB 找到某一个按钮，获取按钮的类型
    使用 choose(AttachmentButton)
    pactions(#地址)        // 给个对象，输出它的Actions
    rp(#对象地址)           // 获取这个对象的响应链条
 6.monkeyDev Config 中的URL ，通过浏览器打开，会发现一个*.cy文件
    1.自己创建 *.cy文件，创建空类型的文件，文件依赖当前的工程
    2.文件类型改成JavaScript或者oc、C++语法，重启Xcode才会有语法高亮
    3.在cy环境下测试函数，输入以下代码
        sum = function(a,b){return a+b;}
        sub(10,20)
    4.在cy文件中添加上述代码，并导入到app中，TARGETS -> 项目 -> Build Phases -> Copy Files 中添加 test.cy 文件
    5.在cy环境下 @inport test 文件，否则找不到文件
    6.接下来我们就可以在我们的文件中添加自己需要的代码了
        注意：我们在文件中添加的变量要用函数的方法获得，否则变量会在执行第一次之后就固定了。
    7.js 匿名函数自执行表达式
    ( function(export(参数)){
        code ...
        // 代码自动执行
        // 变量后需要用逗号隔开
    })(export)
*/
@end
